package anlage;

import java.awt.Color;
import java.awt.Graphics;
import java.util.ArrayList;

import steuerung.Ablaufsteuerung;
import verbindung.DBDSingleton;

/**
 * 
 * @author Nilientes
 * 
 */
public class Weiche extends AnlageObjekt {

	boolean bauartLinks;
	int laenge;

	int istwert;

	boolean istGesperrt;
	
	long umsetzzeit;
	final static long MAXREAKTION = 99999;
	
	ArrayList<Integer> befehle = new ArrayList<Integer>();

	/**
	 * 
	 * @param steuerung
	 * @param id
	 * @param varsoll
	 * @param varist
	 * @param belegt
	 */
	public Weiche(Ablaufsteuerung steuerung, int id, String varsoll, String varist, String belegt) {
		super(steuerung, id, varsoll, varist, belegt);

		istwert = DBDSingleton.getClient().getVar(varist);

		DBDSingleton.getClient().subscribeVar(varist, this);

	}

	private int getGerade()
	{
		if (bauartLinks) return 2;
		else return 1;
	}

	private int getAbzw()
	{
		if (bauartLinks) return 1;
		else return 2;
	}

	@Override
	public void paint(Graphics g, int x, int y)
	{

		if (istBelegt) g.setColor(Color.RED);
		else g.setColor(Color.BLACK);
		
		if (istwert == getGerade()) 
			g.drawLine(x, y, x+20, y);
		else
			g.drawLine(x+5, y, x+20, y);
		
		
		if(!bauartLinks)
			nachfolger1.paint(g, x+20, y);
		else
			nachfolger2.paint(g, x+20, y);
		
		if (istBelegt) g.setColor(Color.RED);
		else g.setColor(Color.BLACK);
		
		

		int dy = 0;
		if (!bauartLinks) dy = 20;
		else dy = -20;

		if (istwert == getAbzw())
			g.drawLine(x, y, x + 20 * laenge, y + dy * laenge);
		else
			g.drawLine(x+4, y + dy/5, x + 20 * laenge, y + dy * laenge);
		
		if(!bauartLinks)
			nachfolger2.paint(g, x + 20 * laenge, y + dy * laenge);
		else
			nachfolger1.paint(g, x + 20 * laenge, y + dy * laenge);
		
		int ty = !bauartLinks ? -12 : 1;
		g.drawString(belegt.substring(3,6), x+10, y- ty);
		
		if(istGesperrt)
		{
			g.setColor(Color.RED);
			g.drawString("X", x-2, y+4);
		}
	}

	@Override
	public void call(String var, int value)
	{
		if (varist.toUpperCase().equals(var)) {
			
			
			
			long reaktionszeit = System.currentTimeMillis() - umsetzzeit;
			
			if(reaktionszeit>MAXREAKTION)
			{
				System.err.println("Weiche "+belegt+" stellt zu langsam um");
				setWeiche(istwert);
			}
			else
			{
				istwert = value;
			}
		}
		if (belegt.toUpperCase().equals(var) && value == 0) {
			// gleis wird wieder frei gemeldet
			if (befehle.size() > 1) {
				int setvalue = befehle.get(1).intValue();
				
				if (setvalue != istwert) {
					DBDSingleton.getClient().setVar(varsoll, setvalue);
				}

			}
			if (befehle.size() > 0) befehle.remove(0);
		}
		super.call(var, value);
	}

	@Override
	protected void setWeicheZuNachfolger(AnlageObjekt nachfolger)
	{
		if (nachfolger.equals(nachfolger1)) {

			setWeiche(1);

		}

		if (nachfolger.equals(nachfolger2)) {
			setWeiche(2);

		}
		super.setWeicheZuNachfolger(nachfolger);
	}

	public void setWeiche(int value)
	{
		if (value >= 1 && value <= 2) {
			
				DBDSingleton.getClient().setVar(varsoll, value);
				
				umsetzzeit = System.currentTimeMillis();
		}
	}

	public boolean isIstGesperrt()
	{
		return istGesperrt;
	}

	public void setIstGesperrt(boolean istGesperrt)
	{
		this.istGesperrt = istGesperrt;
	}

	@Override
	public int getGestelltesRichtungsgleis()
	{
		if(istwert==1)
			return nachfolger1.getGestelltesRichtungsgleis();
		if(istwert==2)
			return nachfolger2.getGestelltesRichtungsgleis();
		
		return 0;
		
	}

	
	
}
